import fractions

class Point:
    big_prime_1 = 1200556037
    big_prime_2 = 2444555677

    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y

    def __str__(self):
        s = str(self.x) + ', '
        s += str(self.y)
        return s

    def __repr__(self):
        s = 'Point(' + str(self.x) + ', '
        s += str(self.y) + ')'
        return s

    def __hash__(self):
        n = self.x * self.big_prime_1
        return (n + self.y) % self.big_prime_2

    def __bool__(self):
        return self.x and self.y

    def __int__(self):
        return int(self.x) + int(self.y)

    def __float__(self):
        return float(self.x) + float(self.y)


pt = Point(3,4)


class Dog:
    def __init__(self,n):
        self.n = n

    def __eq__(self, other):
        '''== 运算符的实现；由对称性提供 != 运算符'''
        return self.n == other.n

    def __lt__(self, other):
        '''< 运算符的实现；由对称性提供 > 运算符'''
        return self.n < other.n

    def __le__(self, other):
        '''<= 运算符的实现；由对称性提供 >= 运算符'''
        return self.n <= other.n



class Dogs:
    def __init__(self,d):
        self.d = d

    def __gt__(self, other):
        '''大于测试方法（>）。该方法通过对称性规则提供了小于的比较方法
        如果 a > b，则 b < a
        '''
        if type(other) == Dogs:
            return self.d > other.d
        else:
            return self.d > other

    def __lt__(self, other):
        '''小于测试方法（<）。此方法必须支持与同类对象以及数字对象的比较'''
        if type(other) == Dogs:
            return self.d < other.d
        else:
            return self.d < other

    # 定义 __repr__ 方法相当于定义了 __str__ 方法
    def __repr__(self):
        return 'Dogs(' + str(self.d) + ')'


d1,d5,d10 = Dogs(1),Dogs(5),Dogs(10)
a_list = [50,d5,100,d1,-20,d10,3]
a_list.sort()
print(a_list)



f = fractions.Fraction(1,2)
print(f+1)  # 调用 Fraction.__add__ 此时类的实例（作为左操作数）与另一个对象相加时，调用该类的 __add__ 方法
print(2+f)  # 调用 Fraction.__radd__ 此时类的实例作为右操作数










